package typeErasure;

public class GenericTest2 {

    // 泛型类
    public class  Generic1<T> {

        private T key;

        public Generic1(T key) {
            this.key = key;
        }


        /**
         * 虽然使用了泛型
         * 但不是泛型方法，只不过是返回值是已经声明过的泛型
         * 所以可以继续使用T这个泛型
         * @return
         */
        public T getKey() {
            return this.key;
        }


        // 编译错误
        // 使用了未声明的类型E，所以在用E做形参和返回值类型时，编译器会无法识别
//        public E setKey(E Key) {
//            this.key = key;
//        }

        /**
         * 泛型方法
         * public与返回值之间<T>必不可少，这表明是一个泛型方法，并且声明了一个泛型T
         * 这个T可以出现在泛型方法的任意位置
         * @param genericType
         * @param <T>
         * @return
         */
        public  <T> T showKeyName(GenericType<T> genericType) {
            System.out.println("type:" + genericType.field1);
            T test = genericType.field1;
            return test;

        }

        // 不是泛型方法
        public void showKeyValue1(GenericType<Number> obj) {
            System.out.println("generic test:" + obj.field1);
        }

        // 不是泛型方法
        // 同时也印证了泛型通配符？是一种实参，可以看成为Number等所有类的父类
        public void showKeyValue2(GenericType<?> obj) {
            System.out.println("generic test:" + obj.field1);
        }


        // 编译错误，没有声明泛型E
//        public <T> T showKeyName(GenericType<E> container) {
//
//        }




    }

}
